import { Module, Global, OnModuleInit } from '@nestjs/common';
import { validateAndDecrypt } from './decrypt.utils';

/**
 * 启动验证模块
 * 在应用启动时强制进行许可证验证，失败则阻止应用启动
 */
@Global()
@Module({})
export class StartupValidationModule implements OnModuleInit {

    async onModuleInit() {
        console.log('🚀 应用启动中...');
        console.log('🔍 正在进行许可证验证...');

        if (!await this.performStartupValidation()) {
            console.error('💥 应用启动失败，许可证验证未通过');
            console.error('🛑 程序即将退出...');

            // 短暂延迟确保日志输出
            setTimeout(() => {
                process.exit(1);
            }, 500);
            return;
        }

        console.log('🎉 许可证验证通过，应用启动成功');
    }

    /**
     * 执行启动验证
     * @returns 验证是否通过
     */
    private async performStartupValidation(): Promise<boolean> {
        try {
            const result = validateAndDecrypt();

            // 获取许可证类型
            const licenseType = result.content.licensetype || "0";

            console.log('✅ 许可证状态正常');
            console.log(`📅 创建时间: ${new Date(Date.now() - (result.timeInfo?.difference || 0)).toLocaleString('zh-CN')}`);
            console.log(`⏱️  已使用: ${result.timeInfo?.formattedTime}`);

            if (licenseType === "1") {
                // 永久许可证
                console.log('🎯 许可证类型: 永久版（无时间限制）');
                console.log('♾️  剩余时间: 永久有效');
            } else {
                // 试用许可证
                const remainingDays = this.calculateRemainingDays(parseInt(result.content?.expire), result.timeInfo?.difference || 0);
                console.log(`🎯 许可证类型: 试用版（${result.content?.expire}天限制）`,);
                console.log(`⏰ 剩余天数: ${remainingDays}天`);

                // 剩余天数少于3天时发出警告
                if (remainingDays <= 3 && remainingDays > 0) {
                    console.warn('⚠️  警告: 试用许可证即将过期！');
                    console.warn(`⏰ 剩余时间仅有: ${remainingDays}天`);
                    console.warn('📞 请联系软件提供商升级为永久许可证');
                }
            }

            return true;
        } catch (error) {
            const errorMessage = error instanceof Error ? error.message : String(error);

            // 区分不同类型的错误
            if (errorMessage.includes('试用许可证已过期')) {
                console.error('❌ 试用许可证已过期');
                console.error(`📅 ${errorMessage}`);
                console.error('🚫 应用无法启动');
                console.error('🔄 请联系软件提供商升级为永久许可证');
            } else if (errorMessage.includes('许可证已过期')) {
                console.error('❌ 许可证已过期');
                console.error('📅 许可证使用期限已超过限制');
                console.error('🚫 应用无法启动');
                console.error('🔄 请联系软件提供商更新许可证');
            } else if (errorMessage.includes('未找到')) {
                console.error('❌ 许可证文件缺失');
                console.error(`📄 错误详情: ${errorMessage}`);
                this.printTroubleshootingGuide();
            } else {
                console.error('❌ 许可证验证失败:', errorMessage);
                this.printTroubleshootingGuide();
            }

            return false;
        }
    }

    /**
     * 计算剩余天数
     * @param timeDifference 已过时间（毫秒）
     * @returns 剩余天数
     */
    private calculateRemainingDays(thirtyOneDaysMs: number, timeDifference: number): number {
        const _thirtyOneDaysMs = thirtyOneDaysMs * 24 * 60 * 60 * 1000;
        const remainingMs = _thirtyOneDaysMs - timeDifference;
        const remainingDays = Math.floor(remainingMs / (24 * 60 * 60 * 1000));
        return Math.max(0, remainingDays);
    }

    /**
     * 打印故障排除指南
     */
    private printTroubleshootingGuide(): void {
        console.error('🔧 故障排除指南:');
        console.error('   1. 检查项目根目录是否存在 private_key.pem 文件');
        console.error('   2. 检查项目根目录是否存在 encrypted.txt 文件');
        console.error('   3. 确认文件内容完整且未被修改');
        console.error('   4. 确认私钥与加密文件匹配');
        console.error('   5. 检查文件访问权限');
        console.error('');
        console.error('📁 当前工作目录:', process.cwd());
        console.error('🔍 请确保许可证文件位于正确位置');
    }
} 